接下來實做一下怎麼對二進制文件
做操作
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
f = open('foo.txt', 'rb', encoding='utf-8') # 讀取二進制文件
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
---------------執行結果---------------
Traceback (most recent call last):
File "/Python/project/path/file_operation.py", line 4, in <module>
f = open('foo.txt', 'rb', encoding='utf-8') # 讀取二進制文件
ValueError: binary mode doesn't take an encoding argument
Process finished with exit code 1
若是讀取二進制
文件,就不需要傳encoding
編碼的參數給它,否則就會報錯,試試把encoding
拿掉看看會有什麼結果?
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
f = open('foo.txt', 'rb') # 讀取二進制文件
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
---------------執行結果---------------
b'----------\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c----------\n'
b'----------\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c----------\n'
b'----------\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c----------\n'
Process finished with exit code 0
有看到前面多了一個b
代表這個是一個`bytes-like 這個就是指二進制的文件
那既然有rb
,也就有wb
,那就來看一下怎麼用?
f = open('foo.txt', 'wb') # 寫入二進制文件
f.write("Hello Binary\n")
f.close()
---------------執行結果---------------
Traceback (most recent call last):
File "/Python/project/path/file_operation.py", line 4, in <module>
f = open('fooo.txt', 'rb') # 讀取二進制文件
TypeError: a bytes-like object is required, not 'str'
Process finished with exit code 1
出現TypeError: a bytes-like object is required, not 'str'
這是說明不能是一個字符串,所以我們要把字符串
轉成bytes類型(可以回頭參考一下)
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
f = open('foo.txt', 'wb') # 寫入二進制文件
f.write("Hello Binary\n".encode())
f.close()
---------------執行結果---------------
觀察文件內容:
Hello Binary
咦!奇怪,為什麼看到的還是一個字符串?其實存的時候不是以0101儲存的
,而是文件以二進制編碼儲存
知識點:
U
表示在讀取時,會將\r
、\n
、\r\n
自動轉換成\n
(與 r 或 r+ 模式使用)
b
表示處理二進制文件 (如:FTP上傳ISO檔的文件,Linux可以怱略,但windows處理二進制文件時,需要標注)